/**
 * Copyright 2013 Theodor Costache
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License. 
 */
package de.costache.calendar.ui.strategy;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import de.costache.calendar.ui.ContentPanel;

/**
 * 
 * @author theodorcostache
 * 
 */
public class DisplayStrategyFactory {

	private final Map<ContentPanel, Map<DisplayStrategy.Type, DisplayStrategy>> cache;

	public static final DisplayStrategyFactory instance = new DisplayStrategyFactory();

	/**
	 * 
	 */
	private DisplayStrategyFactory() {
		cache = Collections.synchronizedMap(new HashMap<ContentPanel, Map<DisplayStrategy.Type, DisplayStrategy>>());
	}

	public static DisplayStrategy getStrategy(final ContentPanel parent, final DisplayStrategy.Type type) {

		Map<DisplayStrategy.Type, DisplayStrategy> strategyCache = instance.cache.get(parent);
		if (strategyCache == null) {
			strategyCache = new HashMap<DisplayStrategy.Type, DisplayStrategy>();
			instance.cache.put(parent, strategyCache);
		}
		switch (type) {
		case MONTH:
			if (!strategyCache.containsKey(type))
				strategyCache.put(type, new MonthDisplayStrategy(parent));
			break;
		case WEEK:
			if (!strategyCache.containsKey(type))
				strategyCache.put(type, new WeekDisplayStrategy(parent));
			break;
		case DAY:
			if (!strategyCache.containsKey(type))
				strategyCache.put(type, new DayDisplayStrategy(parent));
			break;
		default:
			throw new IllegalArgumentException("Unknown type " + type.toString());

		}
		return strategyCache.get(type);
	}

	public static void clearCache() {
		instance.cache.clear();
	}
}
